[404218]: / Code / All Qiskit, PennyLane QML Nov 23 / 10a4 Eff. Dimension .97Local kkawchak.ipynb

Download this file

1053 lines (1052 with data), 165.8 kB

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Effective Dimension of Qiskit Neural Networks\n",
    "In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
    "\n",
    "Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 1. Global vs. Local Effective Dimension\n",
    "Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
    "\n",
    "Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
    "\n",
    "The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. The Effective Dimension Algorithm\n",
    "\n",
    "Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
    "\n",
    "In particular, this algorithm follows 4 main steps:\n",
    "\n",
    "1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
    "2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
    "3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
    "4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 3. Basic Example (SamplerQNN)\n",
    "\n",
    "This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
    "\n",
    "We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_782/2968235742.py:6: DeprecationWarning: ``qiskit.algorithms`` has been migrated to an independent package: https://github.com/qiskit-community/qiskit-algorithms. The ``qiskit.algorithms`` import path is deprecated as of qiskit-terra 0.25.0 and will be removed no earlier than 3 months after the release date. Please run ``pip install qiskit_algorithms`` and use ``import qiskit_algorithms`` instead.\n",
      "  from qiskit.algorithms.optimizers import COBYLA\n"
     ]
    }
   ],
   "source": [
    "# Necessary imports\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from IPython.display import clear_output\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.algorithms.optimizers import COBYLA\n",
    "from qiskit.circuit.library import ZFeatureMap, RealAmplitudes, ZZFeatureMap\n",
    "from qiskit.utils import algorithm_globals\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
    "from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
    "\n",
    "# set random seed\n",
    "algorithm_globals.random_seed = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "### 3.1 Define QNN\n",
    "\n",
    "The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits, and we will define the circuit used in the `SamplerQNN` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 621.941x284.278 with 1 Axes>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_qubits = 3\n",
    "# create a feature map\n",
    "feature_map = ZZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
    "# create a variational circuit\n",
    "ansatz = RealAmplitudes(num_qubits, reps=1)\n",
    "\n",
    "# combine feature map and ansatz into a single circuit\n",
    "qc = QuantumCircuit(num_qubits)\n",
    "qc.append(feature_map, range(num_qubits))\n",
    "qc.append(ansatz, range(num_qubits))\n",
    "qc.decompose().draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# parity maps bitstrings to 0 or 1\n",
    "def parity(x):\n",
    "    return \"{:b}\".format(x).count(\"1\") % 2\n",
    "\n",
    "\n",
    "output_shape = 2  # corresponds to the number of classes, possible outcomes of the (parity) mapping."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct QNN\n",
    "qnn = SamplerQNN(\n",
    "    circuit=qc,\n",
    "    input_params=feature_map.parameters,\n",
    "    weight_params=ansatz.parameters,\n",
    "    interpret=parity,\n",
    "    output_shape=output_shape,\n",
    "    sparse=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Set up Effective Dimension calculation\n",
    "\n",
    "In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can set the total number of input samples and weight samples for random selection\n",
    "num_input_samples = 10\n",
    "num_weight_samples = 10\n",
    "\n",
    "global_ed = EffectiveDimension(\n",
    "    qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can also provide user-defined samples and parameters\n",
    "input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
    "weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
    "\n",
    "global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# finally, we will define ranges to test different numbers of data, n\n",
    "n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 Compute Global Effective Dimension\n",
    "Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data size: 5000, global effective dimension: 5.2939\n",
      "Number of weights: 6, normalized effective dimension: 0.8823\n"
     ]
    }
   ],
   "source": [
    "d = qnn.num_weights\n",
    "\n",
    "print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
    "print(\n",
    "    \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Effective dimension: [5.29390229 5.33597126 5.35545289 5.46354885 5.49042841 5.52135717\n",
      " 5.54374079 5.55854944 5.60045031 5.62756494]\n",
      "Number of weights: 6\n"
     ]
    }
   ],
   "source": [
    "print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
    "print(\"Number of weights: {}\".format(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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+sEEzgEiIo3NnTsXW7duxZEjR9TamzZtivT0dLUkSJu1e/7++2/Vz2VlZYiPj1f9X1+XLl1w9uxZuLm5oXXr1movMUmPtbU1nJ2dcejQIbX2Q4cOPbZH5lHu7u4wMzPD0aNHVW137txR/ZIGyid137p1C3PnzkWfPn3g6elZqder4ik1hUKhart16xaSkpIQGRmJ559/Hu3atcOdO3c0jo3I0PLz83Hy5EnV74crV67g5MmTSElJQdu2bTF8+HAEBwcjNjYWV65cwbFjxxAdHY3t27cDKH8oo0uXLnj33XeRkJCA+Ph4fPDBB3jhhRfUeoU0wQSIiDTWqVMnDB8+HN9++61a+7PPPousrCx88cUXuHz5MhYvXow///xTa9+7ePFibNq0CYmJiQgLC8OdO3fw7rvvAgDCwsJw+/ZtvP322/jnn39w+fJl7Ny5E6GhoWrJgyYmTpyIefPmYf369UhKSkJERAROnjyJ8ePHa3wMS0tLvPfee5g4cSL27NmDf//9FyNHjlQb+mvevDnMzc2xcOFCJCcn4/fff8esWbPUjtOiRQtIJBJs27YNWVlZyM/PR6NGjdCkSRN8//33uHTpEvbs2YPw8HBR50hkSMePH4ePjw98fHwAAOHh4fDx8cH06dMBAMuXL0dwcDA++eQTeHh4YODAgfjnn3/QvHlzAOW9zVu3boWdnR369u2LV155Be3atcO6devEB6OFeUxEVE89PAm6wpUrVwRzc3Ph0V8fS5YsEVxdXYWGDRsKwcHBwuzZsytNgn70WP369as0MbhFixbCN998o/ouAMKaNWsEX19fwdzcXGjfvr2wZ88etX0uXLggDBo0SLC1tRXkcrng6ekpTJgwQVAqldV+T1UUCoUwY8YMwcXFRTAzMxO8vLyEP//8U22bJ02CFoTyidDvvPOO0KBBA8HBwUH44osvKsWwZs0awc3NTbCwsBB69Ogh/P777wIAISEhQbXNzJkzBUdHR0EikQghISGCIAjC7t27hXbt2gkWFhZC586dhX379lWaTEpETyYRhEcG7omIiIjqOQ6BERERkdFhAkRERERGhwkQERERGR0mQERERGR0mAARERGR0WECREREREaHCRAREREZHSZAREREZHSYABEREZHRYQJERERERocJEBERERkdJkBERERkdP4fzksyO9XWIyMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(global_eff_dim_1) / d)\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 4. Local Effective Dimension Example\n",
    "As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
    "\n",
    "This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1 Define Dataset and QNN\n",
    "\n",
    "We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "num_inputs = 3\n",
    "num_samples = 50\n",
    "\n",
    "X, y = make_classification(\n",
    "    n_samples=num_samples,\n",
    "    n_features=num_inputs,\n",
    "    n_informative=3,\n",
    "    n_redundant=0,\n",
    "    n_clusters_per_class=1,\n",
    "    class_sep=2.0,\n",
    ")\n",
    "X = MinMaxScaler().fit_transform(X)\n",
    "y = 2 * y - 1  # labels in {-1, 1}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "estimator_qnn = EstimatorQNN(\n",
    "    circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2 Train QNN\n",
    "\n",
    "We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# callback function that draws a live plot when the .fit() method is called\n",
    "def callback_graph(weights, obj_func_eval):\n",
    "    clear_output(wait=True)\n",
    "    objective_func_vals.append(obj_func_eval)\n",
    "    plt.title(\"Objective function value against iteration\")\n",
    "    plt.xlabel(\"Iteration\")\n",
    "    plt.ylabel(\"Objective function value\")\n",
    "    plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct classifier\n",
    "initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
    "\n",
    "estimator_classifier = NeuralNetworkClassifier(\n",
    "    neural_network=estimator_qnn,\n",
    "    optimizer=COBYLA(maxiter=80, rhobeg=1.12),\n",
    "    initial_point=initial_point,\n",
    "    callback=callback_graph,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAIjCAYAAAB/OVoZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACK1ElEQVR4nOzdd3zT1f7H8XeSNuneUCgUCkX2FIQLbsGBWxw4foqg13HxinL1XrleBfQKXr3XeR3XiV4HKK7rdV0FEVBUEAFl773a0r2T7++PNGlLB02bNKOv5+PRR5tvvkk+SVrlnXPO55gMwzAEAAAAAAD8zuzvAgAAAAAAgBMhHQAAAACAAEFIBwAAAAAgQBDSAQAAAAAIEIR0AAAAAAACBCEdAAAAAIAAQUgHAAAAACBAENIBAAAAAAgQhHQAAAAAAAIEIR0AgtSMGTNkMpmUlZV1zHMzMjJ0/fXX+76oo8yZM0cmk0k7duxo9cdevny5Ro0apejoaJlMJq1atarVa2gKf7033ubP99qfTCaTZsyY4e8yJAXne+D67xgAoBohHQACyNq1a/V///d/6tSpk2w2m9LS0nTNNddo7dq1/i6tUbNmzdKHH37o7zLcKioqdPnllysnJ0ePP/64/v3vf6tr165+q+e7777TjBkzlJub67caEHz27dunGTNmtOgDpmeffVZz5szxWk3NUVxcrBkzZmjRokV+rQMAgoXJMAzD30UAAKT3339fV111lZKSknTDDTeoW7du2rFjh15++WVlZ2dr7ty5uuSSS9znz5gxQzNnztThw4eVkpLS6H2XlZXJbDYrPDzcJ7XHxMTosssuqxMG7Ha7KioqZLPZWnW0bMOGDerTp49efPFF3Xjjja32uA35+9//rrvvvlvbt29XRkZGret8/d60ljlz5mjixIn1PsdQVlpaqrCwMIWFhXn9vlesWKETTjhBr776apNmW9T399a/f3+lpKT4NSBnZWWpXbt2mj59ep1ZB5WVlaqsrFRERIR/igOAAOT9/6MAADy2detWXXvtterevbsWL16sdu3aua+bMmWKTj75ZF177bVas2aNunfv7vH922w2b5bbZBaLRRaLpdUf99ChQ5KkhISEVn9sT/nrvYF3BFK4bK2/t8rKSjkcDlmt1hbfl68+4ACAYMZ0dwAIAI8++qiKi4v1wgsv1ArokpSSkqJ//etfKioq0iOPPFLntllZWbriiisUFxen5ORkTZkyRaWlpbXOqW/dc25uru644w6lp6fLZrOpR48e+tvf/iaHw1HrPIfDoSeffFIDBgxQRESE2rVrp3POOUcrVqyQ5FyTW1RUpNdee00mk0kmk8n9WEevkT3//PMb/JBh5MiRGjZsWK1jb7zxhoYOHarIyEglJSXpyiuv1O7duxt9La+//nqdeuqpkqTLL79cJpNJp512miTptNNOc/989G1qjv7u2LFDJpNJf//73/XCCy8oMzNTNptNJ5xwgpYvX17n9hs2bNAVV1yhdu3aKTIyUr169dK9994ryTnj4e6775YkdevWzf0auV6T+t6bbdu26fLLL1dSUpKioqL0m9/8Rp988kmtcxYtWiSTyaR33nlHDz30kDp37qyIiAiNHj1aW7ZsafQ1mj9/vkwmk7755ps61/3rX/+SyWTSr7/+Kklas2aNrr/+enXv3l0RERHq0KGDJk2apOzs7EYfQ2p4vXZLfh/r89FHH+m8885TWlqabDabMjMz9eCDD8put9c595lnnlH37t0VGRmp4cOHa8mSJXV+L8rLy3X//fdr6NChio+PV3R0tE4++WR9/fXXx3yOrjXWW7Zs0fXXX6+EhATFx8dr4sSJKi4urnXbL7/8UieddJISEhIUExOjXr166c9//rMk5/t7wgknSJImTpzo/r1pbOr60X9vGRkZWrt2rb755hv37Ws+z6a85jX/Fp544gn338K6deua9Drt2LHD/d+0mTNnuutwvWb1rUmvrKzUgw8+6H6sjIwM/fnPf1ZZWVmt8zIyMnT++edr6dKlGj58uCIiItS9e3e9/vrrDb5GABAM+OgSAALAxx9/rIyMDJ188sn1Xn/KKacoIyOjTlCTpCuuuEIZGRmaPXu2vv/+ez311FM6cuRIo/9QLS4u1qmnnqq9e/fq5ptvVpcuXfTdd99p2rRp2r9/v5544gn3uTfccIPmzJmjsWPH6sYbb1RlZaWWLFmi77//XsOGDdO///1v3XjjjRo+fLhuuukmSVJmZma9jzt+/Hhdd911Wr58uTuASNLOnTv1/fff69FHH3Ufe+ihh3Tffffpiiuu0I033qjDhw/r6aef1imnnKKff/65wVHym2++WZ06ddKsWbN0++2364QTTlBqamqDr0Vj3nrrLRUUFOjmm2+WyWTSI488onHjxmnbtm3u6elr1qzRySefrPDwcN10003KyMjQ1q1b9fHHH+uhhx7SuHHjtGnTJr399tt6/PHH3UsTjv4wxuXgwYMaNWqUiouLdfvttys5OVmvvfaaLrzwQs2fP7/WkgdJevjhh2U2m3XXXXcpLy9PjzzyiK655hr98MMPDT6v8847TzExMXrnnXfcH2i4zJs3T/369VP//v0lOYPktm3bNHHiRHXo0EFr167VCy+8oLVr1+r777/3yjIGT34f6zNnzhzFxMRo6tSpiomJ0cKFC3X//fcrPz+/1u/Uc889p9tuu00nn3yy7rzzTu3YsUMXX3yxEhMT1blzZ/d5+fn5eumll3TVVVfpt7/9rQoKCvTyyy/r7LPP1o8//qjBgwcf8zldccUV6tatm2bPnq2VK1fqpZdeUvv27fW3v/1NkrP/xPnnn6+BAwfqgQcekM1m05YtW/Ttt99Kkvr06aMHHnhA999/v2666Sb3fxtGjRrV5Nf1iSee0O9//3vFxMS4PzRy/S14+pq/+uqrKi0t1U033SSbzaakpKQmvU7t2rXTc889p1tvvVWXXHKJxo0bJ0kaOHBgg3XfeOONeu2113TZZZfpD3/4g3744QfNnj1b69ev1wcffFDr3C1btuiyyy7TDTfcoAkTJuiVV17R9ddfr6FDh6pfv35Nfq0AIKAYAAC/ys3NNSQZF110UaPnXXjhhYYkIz8/3zAMw5g+fbohybjwwgtrnfe73/3OkGSsXr3afaxr167GhAkT3JcffPBBIzo62ti0aVOt295zzz2GxWIxdu3aZRiGYSxcuNCQZNx+++116nE4HO6fo6Oja92/y6uvvmpIMrZv324YhmHk5eUZNpvN+MMf/lDrvEceecQwmUzGzp07DcMwjB07dhgWi8V46KGHap33yy+/GGFhYXWOH+3rr782JBnvvvtureOnnnqqceqpp9Y5f8KECUbXrl3dl7dv325IMpKTk42cnBz38Y8++siQZHz88cfuY6eccooRGxvrrt2l5uvz6KOP1nodajr6vbnjjjsMScaSJUvcxwoKCoxu3boZGRkZht1ur/Uc+/TpY5SVlbnPffLJJw1Jxi+//FL/i1PlqquuMtq3b29UVla6j+3fv98wm83GAw884D5WXFxc57Zvv/22IclYvHix+9jR77VhGIYkY/r06cd8zk39fWxI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F15QRkaG+vbt26xa6zNmzBglJSVp3rx5mjdvnoYPH17rAx/XKOXR78Gxuq27ZGZm1lnb/MILL9QZSW/q72N96quxvLxczz77bK3zhg0bpuTkZL344ou17u/NN9+sMzW6vvv84Ycfar0nLZWTk1PnmKtrvGurMU9+bxrS0N9mS15zl6a+TlFRUe77PZZzzz1XUt3fsccee0ySc2cCAAh1jKQDQAA47rjj9Nprr+maa67RgAEDdMMNN6hbt27asWOHXn75ZWVlZentt9+ud2uz7du368ILL9Q555yjZcuW6Y033tDVV1+tQYMGNfh4d999t/7zn//o/PPPd29XVFRUpF9++UXz58/Xjh07lJKSotNPP13XXnutnnrqKW3evNk9xXnJkiU6/fTTddttt0mShg4dqq+++kqPPfaY0tLS1K1bt3rXVbuce+65io2N1V133SWLxaJLL7201vWZmZn661//qmnTprm3yYqNjdX27dv1wQcf6KabbtJdd93l8es8adIkPfbYYzr77LN1ww036NChQ3r++efVr1+/OmuZm+qpp57SSSedpOOPP1433XST+3375JNPtGrVKknO10eS7r33Xl155ZUKDw/XBRdc4A5hNd1zzz16++23NXbsWN1+++1KSkrSa6+9pu3bt+u9997z6nrl8PBwjRs3TnPnzlVRUZH+/ve/17o+Li5Op5xyih555BFVVFSoU6dO+t///ldnlLohN954o2655RZdeumlOvPMM7V69Wp98cUX7m3oXJr6+1ifUaNGKTExURMmTNDtt98uk8mkf//733U+WLBarZoxY4Z+//vf64wzztAVV1yhHTt2aM6cOcrMzKw12nv++efr/fff1yWXXKLzzjtP27dv1/PPP6++ffuqsLCwSc/9WB544AEtXrxY5513nrp27apDhw7p2WefVefOnd2zaTIzM5WQkKDnn39esbGxio6O1ogRIzxa7z106FA999xz+utf/6oePXqoffv2OuOMM1r0mrs09XWKjIxU3759NW/ePPXs2VNJSUnq379/vb0cBg0apAkTJuiFF15wL2X48ccf9dprr+niiy+uNQsCAEJWK3eTBwA0Ys2aNcZVV11ldOzY0QgPDzc6dOhgXHXVVfVup+XaumjdunXGZZddZsTGxhqJiYnGbbfdZpSUlNQ69+gtrwzDua3XtGnTjB49ehhW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\n",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create empty array for callback to store evaluations of the objective function (callback)\n",
    "objective_func_vals = []\n",
    "plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
    "\n",
    "# fit classifier to data\n",
    "estimator_classifier.fit(X, y)\n",
    "\n",
    "# return to default figsize\n",
    "plt.rcParams[\"figure.figsize\"] = (6, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The classifier can now differentiate between classes with an accuracy of:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.94"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# score classifier\n",
    "estimator_classifier.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3 Compute Local Effective Dimension of trained QNN\n",
    "\n",
    "Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for trained QNN:  [0.82938147 0.84024874 0.84521339 0.87215109 0.87871636 0.88621813\n",
      " 0.89161662 0.89517578 0.90520217 0.91166343]\n"
     ]
    }
   ],
   "source": [
    "trained_weights = estimator_classifier.weights\n",
    "\n",
    "# get Local Effective Dimension for set of trained weights\n",
    "local_ed_trained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for trained QNN: \",\n",
    "    local_eff_dim_trained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.4 Compute Local Effective Dimension of untrained QNN\n",
    "\n",
    "We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for untrained QNN:  [0.94804106 0.95120936 0.95268598 0.96083833 0.96284224 0.9651354\n",
      " 0.96678715 0.96787664 0.97094727 0.97292683]\n"
     ]
    }
   ],
   "source": [
    "# get Local Effective Dimension for set of untrained weights\n",
    "local_ed_untrained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for untrained QNN: \",\n",
    "    local_eff_dim_untrained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 4.5 Plot and analyze results\n",
    "\n",
    "If we plot the effective dimension values before and after training, we can see the following result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
    "plt.plot(\n",
    "    n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
    ")\n",
    "\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples.  \n",
    "\n",
    "Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
    "\n",
    "We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.142810821533203</td></tr><tr><td colspan='2'>Wed Nov 22 16:32:18 2023 UTC</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import qiskit.tools.jupyter\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "0ce1af1e9e6b4086aa263719e6ca30b0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "18d3f5e7bec6446f94b8977684e22fc5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "1eae22379d7c472fb0d3ab278c4f4316": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_935d07c21f154ba78108492cfa5087d3",
        "IPY_MODEL_9b975b12c13343a5947f45f0212b720f",
        "IPY_MODEL_ca1f9d8ed811407da952c95d32f61ab0",
        "IPY_MODEL_e5f8206339f04681b887cf4685ce15f2",
        "IPY_MODEL_f62b8eefdd584afc9bce5d0b010654cb"
       ],
       "layout": "IPY_MODEL_5157f08c4588480ea58e4cf75fdb1119"
      }
     },
     "22446b72fb314e28bbbdb280a69536d3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "32741c5f4a6747a2af880c1de88296b2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "190px"
      }
     },
     "33d8f20db490420d946311dcdf14ca2f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "primary",
       "description": "Clear",
       "layout": "IPY_MODEL_61e4d544e6094cf8ae40d271ccbdd584",
       "style": "IPY_MODEL_ba5f714f236c4c72a4d1783661f08849",
       "tooltip": null
      }
     },
     "346bd9272d4047ac85b213cc32506908": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "70px"
      }
     },
     "50c25455e75c497ba732953c3d56c741": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_c367df80486642188fa7f14ae2c1bc33",
       "style": "IPY_MODEL_ed7afe9da4a14246ab275c234b0a00b3",
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
      }
     },
     "5157f08c4588480ea58e4cf75fdb1119": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 0px 37px",
       "width": "600px"
      }
     },
     "5bddc23101fc4242a02b2e2449ba370c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
       "grid_template_columns": "20% 20% 20% 20% 20%",
       "width": "100%"
      }
     },
     "61e4d544e6094cf8ae40d271ccbdd584": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_area": "right",
       "padding": "0px 0px 0px 0px",
       "width": "70px"
      }
     },
     "935d07c21f154ba78108492cfa5087d3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_32741c5f4a6747a2af880c1de88296b2",
       "style": "IPY_MODEL_18d3f5e7bec6446f94b8977684e22fc5",
       "value": "<h5>Job ID</h5>"
      }
     },
     "97ff3846521f435ca2505575b890023e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "95px"
      }
     },
     "9b975b12c13343a5947f45f0212b720f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_9cefa43626e74d43ace77456c0f50019",
       "style": "IPY_MODEL_0ce1af1e9e6b4086aa263719e6ca30b0",
       "value": "<h5>Backend</h5>"
      }
     },
     "9cefa43626e74d43ace77456c0f50019": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "145px"
      }
     },
     "ba5f714f236c4c72a4d1783661f08849": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "c367df80486642188fa7f14ae2c1bc33": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 10px 0px"
      }
     },
     "ca1f9d8ed811407da952c95d32f61ab0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_97ff3846521f435ca2505575b890023e",
       "style": "IPY_MODEL_efb275c946124fd4b40e1b63288b67b7",
       "value": "<h5>Status</h5>"
      }
     },
     "d46d84abc0d94b04a2785adbfef028d2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d9b1402844bb4833a339d3c1778a547e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "dc40cdd33afa4e909b70476f65904163": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "GridBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_33d8f20db490420d946311dcdf14ca2f"
       ],
       "layout": "IPY_MODEL_5bddc23101fc4242a02b2e2449ba370c"
      }
     },
     "e5f8206339f04681b887cf4685ce15f2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_346bd9272d4047ac85b213cc32506908",
       "style": "IPY_MODEL_22446b72fb314e28bbbdb280a69536d3",
       "value": "<h5>Queue</h5>"
      }
     },
     "ed7afe9da4a14246ab275c234b0a00b3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "efb275c946124fd4b40e1b63288b67b7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "f62b8eefdd584afc9bce5d0b010654cb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_d46d84abc0d94b04a2785adbfef028d2",
       "style": "IPY_MODEL_d9b1402844bb4833a339d3c1778a547e",
       "value": "<h5>Message</h5>"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}